// app/controller/invitation_controller.js
'use strict';

const Controller = require('egg').Controller;

class InvitationController extends Controller {
  // 生成邀请链接
  async generateInvitation() {
    const { ctx } = this;
    
    try {
      const { organizationId, email, role } = ctx.request.body;
      const invitedBy = ctx.state.user.id;
      
      // 参数验证
      if (!organizationId || !email || !role) {
        ctx.error('参数不完整', 400);
        return;
      }
      
      // 检查用户是否有权限邀请（必须是组织成员）
      const userOrganization = await ctx.model.UserOrganizationModel.findOne({
        where: {
          userId: invitedBy,
          organizationId: organizationId
        }
      });
      
      if (!userOrganization) {
        ctx.error('您没有权限邀请用户到该组织', 403);
        return;
      }
      
      // 调用服务生成邀请
      const result = await ctx.service.invitationService.generateInvitation(
        organizationId, 
        email, 
        role, 
        invitedBy
      );
      
      if (result.success) {
        ctx.success(result.data, '邀请链接生成成功');
      } else {
        ctx.error(result.message, 400);
      }
    } catch (error) {
      ctx.logger.error('生成邀请链接失败:', error);
      ctx.error(`生成邀请链接失败: ${error.message}`);
    }
  }
  
  // 验证邀请令牌
  async validateInvitation() {
    const { ctx } = this;
    
    try {
      const { token } = ctx.query;
      
      if (!token) {
        ctx.error('缺少邀请令牌', 400);
        return;
      }
      
      const result = await ctx.service.invitationService.validateInvitationToken(token);
      
      if (result.success) {
        ctx.success(result.data);
      } else {
        ctx.error(result.message, 400);
      }
    } catch (error) {
      ctx.logger.error('验证邀请令牌失败:', error);
      ctx.error(`验证邀请令牌失败: ${error.message}`);
    }
  }
  
  // 接受邀请
  async acceptInvitation() {
    const { ctx } = this;
    
    try {
      const { token } = ctx.request.body;
      const userId = ctx.state.user.id;
      
      if (!token) {
        ctx.error('缺少邀请令牌', 400);
        return;
      }
      
      if (!userId) {
        ctx.error('用户未登录', 401);
        return;
      }
      
      const result = await ctx.service.invitationService.acceptInvitation(token, userId);
      
      if (result.success) {
        ctx.success(null, result.message);
      } else {
        ctx.error(result.message, 400);
      }
    } catch (error) {
      ctx.logger.error('接受邀请失败:', error);
      ctx.error(`接受邀请失败: ${error.message}`);
    }
  }
  
  // 获取组织邀请列表
  async getOrganizationInvitations() {
    const { ctx } = this;
    
    try {
      const { organizationId } = ctx.query;
      
      if (!organizationId) {
        ctx.error('缺少组织ID', 400);
        return;
      }
      
      // 检查用户是否有权限查看
      // 超级管理员可以查看所有组织的邀请列表
      let hasPermission = false;
      
      if (ctx.state.user && ctx.state.user.role === 'admin') {
        // 超级管理员有权限
        hasPermission = true;
      } else {
        // 普通用户需要检查是否是组织成员
        const userOrganization = await ctx.model.UserOrganizationModel.findOne({
          where: {
            userId: ctx.state.user.id,
            organizationId: organizationId
          }
        });
        
        hasPermission = !!userOrganization;
      }
      
      if (!hasPermission) {
        ctx.error('您没有权限查看该组织的邀请列表', 403);
        return;
      }
      
      const result = await ctx.service.invitationService.getOrganizationInvitations(organizationId);
      
      if (result.success) {
        ctx.success(result.data);
      } else {
        ctx.error(result.message, 400);
      }
    } catch (error) {
      ctx.logger.error('获取组织邀请列表失败:', error);
      ctx.error(`获取组织邀请列表失败: ${error.message}`);
    }
  }
  
  // 撤销邀请
  async revokeInvitation() {
    const { ctx } = this;
    
    try {
      const { id } = ctx.params;
      
      if (!id) {
        ctx.error('缺少邀请ID', 400);
        return;
      }
      
      // 检查用户是否有权限撤销（必须是邀请人或组织管理员）
      const invitation = await ctx.model.InvitationModel.findByPk(id);
      if (!invitation) {
        ctx.error('邀请记录不存在', 404);
        return;
      }
      
      // 检查权限
      let hasPermission = false;
      
      if (ctx.state.user && ctx.state.user.role === 'admin') {
        // 超级管理员有权限
        hasPermission = true;
      } else {
        // 普通用户需要检查是否是组织成员
        const userOrganization = await ctx.model.UserOrganizationModel.findOne({
          where: {
            userId: ctx.state.user.id,
            organizationId: invitation.organizationId
          }
        });
        
        hasPermission = !!userOrganization;
      }
      
      if (!hasPermission) {
        ctx.error('您没有权限撤销该邀请', 403);
        return;
      }
      
      const result = await ctx.service.invitationService.revokeInvitation(id);
      
      if (result.success) {
        ctx.success(null, result.message);
      } else {
        ctx.error(result.message, 400);
      }
    } catch (error) {
      ctx.logger.error('撤销邀请失败:', error);
      ctx.error(`撤销邀请失败: ${error.message}`);
    }
  }
}

module.exports = InvitationController;